package br.com.petsis.funcionalidades.consultarPedidos;

import java.util.ArrayList;
import java.util.List;

import javax.faces.context.FacesContext;
import javax.faces.model.SelectItem;
import javax.persistence.EntityManager;
import javax.persistence.Query;
import javax.servlet.ServletContext;

import org.jboss.seam.ScopeType;
import org.jboss.seam.annotations.In;
import org.jboss.seam.annotations.Name;
import org.jboss.seam.annotations.Scope;
import org.jboss.seam.annotations.security.Restrict;
import org.jboss.seam.faces.FacesMessages;
import org.jboss.seam.international.StatusMessage.Severity;

import br.com.petsis.entity.Cliente;
import br.com.petsis.entity.Empresa;
import br.com.petsis.entity.FormaPagamento;
import br.com.petsis.entity.Pedido;
import br.com.petsis.entity.PedidoProduto;
import br.com.petsis.entity.PedidoServico;
import br.com.petsis.entity.Perfil;
import br.com.petsis.entity.Produto;
import br.com.petsis.entity.Servico;
import br.com.petsis.entity.Usuario;
import br.com.petsis.utilitarios.UtilString;
import br.com.petsis.vo.ConsultaClientesVO;
import br.com.petsis.vo.ConsultaPedidosVO;

@Name("consultarPedidosController")
@Scope(ScopeType.CONVERSATION)
@Restrict(value="#{!identity.hasRole('"+Perfil.PERFIL_VETERINARIA+"')}")
public class ConsultarPedidosController {
	
	private static final String QRY_PEDIDOS = "select p from Pedido p left join p.pedidoServicos as servico left join p.pedidoProdutos as produto where p.empresa.idEmpresa = :idEmpresa and p.idPedido IS NOT NULL ";
	private static final String QRY_CLIENTES = "select c from Cliente c left join c.pets p where c.empresa.idEmpresa = :idEmpresa and c.flgAtivo = 'T'";
	private static final String QRY_SERVICOS = "select s.id_servico,s.dsc_nome from servico s where s.id_empresa = :idEmpresa and s.flg_ativo = 'T' order by s.dsc_nome";
	private static final String QRY_PETS = "select p from Pet p where p.cliente.empresa.idEmpresa = :idEmpresa and p.cliente.idCliente = :idCliente and p.flgAtivo = 'T'";
	private static final String QRY_PRODUTOS = "select p.id_produto,p.dsc_fabricante,p.dsc_nome from produto p where p.id_empresa = :idEmpresa and p.flg_ativo = 'T' order by p.dsc_fabricante,p.dsc_nome";
	private static final String QRY_SERVICOS_PEDIDO = "select s from PedidoServico s where s.pedido.empresa.idEmpresa = :idEmpresa and s.pedido.idPedido = :idPedido";
	private static final String QRY_PRODUTOS_PEDIDO = "select p from PedidoProduto p where p.pedido.empresa.idEmpresa = :idEmpresa and p.pedido.idPedido = :idPedido";
	private static final String QRY_TIPOS_PAGAMENTO = "select f from FormaPagamento f where f.flgAtivo = 'T' ";
	
	private static final String PARAMETER_ID_CLIENTE = "idCliente";
	private static final String PARAMETER_ID_PEDIDO = "idPedido";
	private static final String PARAMETER_ID_EMPRESA = "idEmpresa";
	
	@In(create=true)
	private EntityManager entityManager;
	
	private List<Pedido> listaPedidos;
	
	private List<Cliente> listaClientes;
	
	private List<SelectItem> listaServicos;
	
	private List<SelectItem> listaProdutos;
	
	private List<SelectItem> listaPets;
	
	private List<PedidoServico> servicosPedido;
	
	private List<SelectItem> listaFormasPagamento;
	
	private List<PedidoProduto> produtosPedido;
	
	private ConsultaPedidosVO parametrosConsulta;
	
	private ConsultaClientesVO parametrosClientes;
	
	private Cliente clienteSelecionado;
	
	private float valorTotalServicos;
	
	private float valorTotalProdutos;
	
	private float valorTotal;
	
	@In
	private Usuario usuarioLogado;
	
	private Pedido pedidoSelecionado;
	
	@In(required=false)
    private Empresa empresaSessao;
	
	public Pedido getPedidoSelecionado() {
		return pedidoSelecionado;
	}

	public void setPedidoSelecionado(Pedido pedidoSelecionado) {
		this.pedidoSelecionado = pedidoSelecionado;
	}

	public void onLoad(){
		if(usuarioLogado != null && usuarioLogado.getCliente() != null){
			clienteSelecionado = usuarioLogado.getCliente();
		}else{
			clienteSelecionado = new Cliente();
		}
	}
	
	public void pesquisarClientes(){
		if(empresaSessao == null){
			return;
		}
		
		StringBuffer query = new StringBuffer(QRY_CLIENTES);
		if(parametrosClientes.getCliente().getDscNome() != null &&
				!parametrosClientes.getCliente().getDscNome().isEmpty()){
			query.append(" and UPPER(c.dscNome) like UPPER('%"+parametrosClientes.getCliente().getDscNome()+"%')");
		}
		
		if(parametrosClientes.getCliente().getTelCelular() != null &&
				!parametrosClientes.getCliente().getTelCelular().isEmpty()){
			query.append(" and c.telCelular = :celular");
		}
		
		if(parametrosClientes.getCliente().getTelResidencial() != null &&
				!parametrosClientes.getCliente().getTelResidencial().isEmpty()){
			query.append(" and c.telResidencial = :residencial");
		}
		
		if(parametrosClientes.getCliente().getDscEndereco() != null &&
				!parametrosClientes.getCliente().getDscEndereco().isEmpty()){
			query.append(" and UPPER(c.dscEndereco) like UPPER('%"+parametrosClientes.getCliente().getDscEndereco()+"%')");
		}
		
		if(parametrosClientes.getCliente().getDscCidade() != null &&
				!parametrosClientes.getCliente().getDscCidade().isEmpty()){
			query.append(" and UPPER(c.dscCidade) = UPPER(:cidade)");
		}
		
		if(parametrosClientes.getNomePet() != null &&
				!parametrosClientes.getNomePet().isEmpty()){
			query.append(" and UPPER(p.dscNome) like UPPER('%"+parametrosClientes.getNomePet()+"%')");
		}
		
		query.append(" group by c.idCliente");
		
		Query qryResult = entityManager.createQuery(query.toString());
		
		qryResult.setParameter(PARAMETER_ID_EMPRESA, empresaSessao.getIdEmpresa());
		
		if(parametrosClientes.getCliente().getTelCelular() != null &&
				!parametrosClientes.getCliente().getTelCelular().isEmpty()){
			qryResult.setParameter("celular", parametrosClientes.getCliente().getTelCelular());
		}
		
		if(parametrosClientes.getCliente().getTelResidencial() != null &&
				!parametrosClientes.getCliente().getTelResidencial().isEmpty()){
			qryResult.setParameter("residencial", parametrosClientes.getCliente().getTelResidencial());
		}
		
		
		if(parametrosClientes.getCliente().getDscCidade() != null &&
				!parametrosClientes.getCliente().getDscCidade().isEmpty()){
			qryResult.setParameter("cidade", parametrosClientes.getCliente().getDscCidade());
		}
		
		listaClientes = qryResult.getResultList();
		
	}
	
	public void pesquisar(){
		StringBuffer query = new StringBuffer(QRY_PEDIDOS);
		
		if(getClienteSelecionado().getIdCliente() != null){
			query.append(" and p.cliente.idCliente = :idCliente");
		}
		/*if(getParametrosConsulta().getIdCliente() != null){
			query.append(" and p.cliente.idCliente = :idCliente");
		}*/
		
		if(getParametrosConsulta().getDataInicio() != null){
			query.append(" and DATE(p.dtaPedido) >= DATE(:dtaInicio)");
		}
		
		if(getParametrosConsulta().getDataFim() != null){
			query.append(" and DATE(p.dtaPedido) <= DATE(:dtaFim)");
		}
		
		if(getParametrosConsulta().getIdServico() != null){
			query.append(" and servico.servico.idServico = :idServico");
		}
		
		if(getParametrosConsulta().getIdPet() != null){
			query.append(" and servico.pet.idPet = :idPet");
		}
		
		if(getParametrosConsulta().getTipoPedido() != null){
			query.append(" and p.tpoPedido = :tpoPedido");
		}
		
		if(getParametrosConsulta().getIdFormaPagamento() != null){
			query.append(" and p.formaPagamento.idFormaPagamento = :idFormaPagamento");
		}
		
		if(getParametrosConsulta().getIsPacote() != null){
			if(getParametrosConsulta().getIsPacote().equals('S')){
				query.append(" and p.pacote IS NOT NULL");
			}
			if(getParametrosConsulta().getIsPacote().equals('N')){
				query.append(" and p.pacote IS NULL");
			}
		}
		
		if(getParametrosConsulta().getFlgPago() != null){
			if(getParametrosConsulta().getFlgPago().equals('T')){
				query.append(" and p.flgPago = 'T'");
			}
			if(getParametrosConsulta().getFlgPago().equals('F')){
				query.append(" and p.flgPago = 'F'");
			}
		}
		
		query.append(" GROUP BY p.idPedido");
		
		Query qryResult = entityManager.createQuery(query.toString());
		
		qryResult.setParameter(PARAMETER_ID_EMPRESA, empresaSessao.getIdEmpresa());
		
		if(getClienteSelecionado().getIdCliente() != null){
			qryResult.setParameter("idCliente", getClienteSelecionado().getIdCliente());
		}
		
		if(getParametrosConsulta().getDataInicio() != null){
			qryResult.setParameter("dtaInicio", getParametrosConsulta().getDataInicio());
		}
		
		if(getParametrosConsulta().getDataFim() != null){
			qryResult.setParameter("dtaFim", getParametrosConsulta().getDataFim());
		}
		
		if(getParametrosConsulta().getIdServico() != null){
			qryResult.setParameter("idServico", getParametrosConsulta().getIdServico());
		}
		
		if(getParametrosConsulta().getIdPet() != null){
			qryResult.setParameter("idPet", getParametrosConsulta().getIdPet());
		}
		
		if(getParametrosConsulta().getTipoPedido() != null){
			qryResult.setParameter("tpoPedido", getParametrosConsulta().getTipoPedido());
		}
		
		if(getParametrosConsulta().getIdFormaPagamento() != null){
			qryResult.setParameter("idFormaPagamento", getParametrosConsulta().getIdFormaPagamento());
		}
		
		listaPedidos = qryResult.getResultList();
		
		valorTotal = 0;
		if(listaPedidos == null || listaPedidos.size() == 0){
			FacesMessages.instance().add(Severity.ERROR,"Nenhum registro encontrado.");
			
		}else{
			for(Pedido p : listaPedidos){
				valorTotal = valorTotal + p.getVlrPedido();
			}
			FacesMessages.instance().add(Severity.INFO,"Foram encontrados "+listaPedidos.size()+" registros.");
		}
	}
	
	public void selecionarCliente(Cliente cliente){
		setClienteSelecionado(cliente);
	}

	public List<Pedido> getListaPedidos() {
		if (listaPedidos == null) {
			listaPedidos = new ArrayList<Pedido>();
		}
		return listaPedidos;
	}

	public void setListaPedidos(List<Pedido> listaPedidos) {
		this.listaPedidos = listaPedidos;
	}

	public ConsultaPedidosVO getParametrosConsulta() {
		if (parametrosConsulta == null) {
			parametrosConsulta = new ConsultaPedidosVO();
		}
		return parametrosConsulta;
	}

	public void setParametrosConsulta(ConsultaPedidosVO parametrosConsulta) {
		this.parametrosConsulta = parametrosConsulta;
	}

	public ConsultaClientesVO getParametrosClientes() {
		if (parametrosClientes == null) {
			parametrosClientes = new ConsultaClientesVO();
		}
		return parametrosClientes;
	}

	public void setParametrosClientes(ConsultaClientesVO parametrosClientes) {
		this.parametrosClientes = parametrosClientes;
	}

	public Cliente getClienteSelecionado() {
		if (clienteSelecionado == null) {
			clienteSelecionado = new Cliente();
		}
		return clienteSelecionado;
	}

	public void setClienteSelecionado(Cliente clienteSelecionado) {
		this.clienteSelecionado = clienteSelecionado;
	}

	public List<Cliente> getListaClientes() {
		if (listaClientes == null) {
			listaClientes = new ArrayList<Cliente>();
			/*listaClientes.add(new SelectItem(null,"Selecione"));
			List<Cliente> clientes = entityManager.createQuery(QRY_CLIENTES).getResultList();
			for(Cliente c : clientes){
				listaClientes.add(new SelectItem(c.getIdCliente(),c.getDscNome()));
			}*/
		}
		return listaClientes;
	}

	public void setListaClientes(List<Cliente> listaClientes) {
		this.listaClientes = listaClientes;
	}

	public List<SelectItem> getListaServicos() {
		if (listaServicos == null) {
			listaServicos = new ArrayList<SelectItem>();
			listaServicos.add(new SelectItem(null,"Selecione"));
			if(empresaSessao != null){
				List<Object[]> servicos = entityManager.createNativeQuery(QRY_SERVICOS)
					.setParameter(PARAMETER_ID_EMPRESA, empresaSessao.getIdEmpresa())
					.getResultList();
				for(Object[] s : servicos){
					listaServicos.add(new SelectItem(Integer.parseInt(s[0].toString()),
							s[1] != null ? s[1].toString() : ""));
				}
			}
 		}
		return listaServicos;
	}

	public void setListaServicos(List<SelectItem> listaServicos) {
		this.listaServicos = listaServicos;
	}

	public List<SelectItem> getListaProdutos() {
		if (listaProdutos == null) {
			listaProdutos = new ArrayList<SelectItem>();
			listaProdutos.add(new SelectItem(null,"Selecione"));
			if(empresaSessao != null){
				List<Object[]> produtos = entityManager.createNativeQuery(QRY_PRODUTOS)
					.setParameter(PARAMETER_ID_EMPRESA, empresaSessao.getIdEmpresa())
					.getResultList();
				for(Object[] p : produtos){
					String fabricante = p[1] != null ? p[1].toString() : "";
					String nome = p[2] != null ? p[2].toString() : "";
					listaProdutos.add(new SelectItem(Integer.parseInt(p[0].toString()),
							fabricante + " - " + nome));
				}
			}
		}
		return listaProdutos;
	}

	public void setListaProdutos(List<SelectItem> listaProdutos) {
		this.listaProdutos = listaProdutos;
	}

	public List<SelectItem> getListaPets() {
		if (listaPets == null) {
			listaPets = new ArrayList<SelectItem>();
		}
		return listaPets;
	}

	public void setListaPets(List<SelectItem> listaPets) {
		this.listaPets = listaPets;
	}

	public List<SelectItem> getListaFormasPagamento() {
		if (listaFormasPagamento == null) {
			listaFormasPagamento = new ArrayList<SelectItem>();
			listaFormasPagamento.add(new SelectItem(null,"Todos"));
			List<FormaPagamento> lista = entityManager.createQuery(QRY_TIPOS_PAGAMENTO).getResultList();
			for(FormaPagamento f : lista){
				listaFormasPagamento.add(new SelectItem(f.getIdFormaPagamento(),f.getDscFormaPagamento()));
			}
		}
		return listaFormasPagamento;
	}

	public void setListaFormasPagamento(List<SelectItem> listaFormasPagamento) {
		this.listaFormasPagamento = listaFormasPagamento;
	}

	public float getValorTotal() {
		return valorTotal;
	}

	public void setValorTotal(float valorTotal) {
		this.valorTotal = valorTotal;
	}
	
	public void detalharServicos(Pedido pedido){
		valorTotalServicos = 0;
		if(empresaSessao != null){
			servicosPedido = entityManager.createQuery(QRY_SERVICOS_PEDIDO)
				.setParameter(PARAMETER_ID_PEDIDO, pedido.getIdPedido())
				.setParameter(PARAMETER_ID_EMPRESA, empresaSessao.getIdEmpresa())
				.getResultList();
			for(PedidoServico s : servicosPedido){
				valorTotalServicos = valorTotalServicos + s.getVlrServico();
			}
		}
	}
	
	public void detalharProdutos(Pedido pedido){
		valorTotalProdutos = 0;
		if(empresaSessao != null){
			produtosPedido = entityManager.createQuery(QRY_PRODUTOS_PEDIDO)
				.setParameter(PARAMETER_ID_PEDIDO, pedido.getIdPedido())
				.setParameter(PARAMETER_ID_EMPRESA, empresaSessao.getIdEmpresa())
				.getResultList();
			for(PedidoProduto p : produtosPedido){
				valorTotalProdutos = valorTotalProdutos + p.getVlrProduto();
			}
		}
	}

	public List<PedidoServico> getServicosPedido() {
		return servicosPedido;
	}

	public void setServicosPedido(List<PedidoServico> servicosPedido) {
		this.servicosPedido = servicosPedido;
	}

	public List<PedidoProduto> getProdutosPedido() {
		return produtosPedido;
	}

	public void setProdutosPedido(List<PedidoProduto> produtosPedido) {
		this.produtosPedido = produtosPedido;
	}

	public float getValorTotalServicos() {
		return valorTotalServicos;
	}

	public void setValorTotalServicos(float valorTotalServicos) {
		this.valorTotalServicos = valorTotalServicos;
	}

	public float getValorTotalProdutos() {
		return valorTotalProdutos;
	}

	public void setValorTotalProdutos(float valorTotalProdutos) {
		this.valorTotalProdutos = valorTotalProdutos;
	}
	
	public String emitirRecibo(Pedido pedido){
		this.pedidoSelecionado = pedido;
		return "recibo";
	}
	
	public String recuperaCaminhoImagem(String nomeImagem){
		FacesContext context1 = FacesContext.getCurrentInstance();
		String caminhoAplicacao = ((ServletContext) context1.getExternalContext().getContext()).getRealPath("/");
		return caminhoAplicacao+"/img/"+nomeImagem;
	}
	
	public String valorPorExtenso(Float valor){
		Double vlrDouble = Double.valueOf(valor);
		return UtilString.valorPorExtenso(vlrDouble);
	}
}
